﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "GcmpSnapInterface.h"
#include "IObject.h"
#include "Color.h"

namespace gcmp {

    /// \brief 捕捉全局设置
    ///
    /// 包含各种可供用户设置的捕捉选项
    FINAL_INTERFACE class GCMP_SNAP_INTERFACE_EXPORT ISnapSettings : public IObject
    {
        DEFINE_CAST_DERIVED(gcmp::ISnapSettings, gcmp::IObject);
    public:
        /// \brief 析构函数
        virtual ~ISnapSettings() {};

        /// \brief 创建捕捉全局设置
        /// \return 捕捉全局设置对象的指针
        ///GetApplication..
        static ISnapSettings* GetGlobalSnapSettings();

        /// \brief 克隆
        /// \return 克隆得到的捕捉全局设置对象
        virtual OwnerPtr<ISnapSettings> Clone() const = 0;

        /// \brief 禁止所有类型的捕捉
        /// \return 成功返回true，失败返回false
        virtual bool DisableAllSnaps() = 0;

        /// \brief 初始化捕捉设置
        /// \return 成功返回true，失败返回false
        virtual bool InitSnapSettings() = 0;

        /// \brief 是否允许3D捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnap3dPoint() const = 0; 

        /// \brief 是否允许捕捉最近点
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapNearest() const = 0;

        /// \brief 是否允许长度增量捕捉
        ///
        /// 开启可捕捉到特定长度，如整十、整百等
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapLength() const = 0;

        /// \brief 是否允许角度增量捕捉
        ///
        /// 开启可捕捉到特定角度，如以5或0结尾的角度数
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapAngle() const = 0;

        /// \brief 是否允许端点捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapEndPoint() const = 0;

        /// \brief 是否允许中点捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapMiddlePoint() const = 0;

        /// \brief 是否允许垂足点捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapPerpendicularPoint() const = 0;

        /// \brief 是否允许捕捉单独的点
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapPoints() const = 0;

        /// \brief 是否允许捕捉自定义点
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapCustomPoint() const = 0;

        /// \brief 是否允许圆心点捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapCenter() const = 0;

        /// \brief 是否允许切点捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapTangent() const = 0;

        /// \brief 是否允许象限点捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapQuadrants() const = 0;

        /// \brief 是否允许捕捉原始线
        ///
        /// 拖拽图元时，捕捉原始线方向或原始线的垂直方向
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapOriginalLine() const = 0;

        /// \brief 是否允许捕捉水平和垂直线
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapHorizontalVerticalLine() const = 0;

        /// \brief 是否允许给定三维坐标系轴向的非对象捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnap3DAxialDirectionLine() const = 0;

        /// \brief 是否允许交点捕捉
        /// \return 允许返回true，不允许返回false
        virtual bool CanSnapIntersectionPoint() const = 0;

        /// \brief 是否关闭了所有捕捉
        /// \return 关闭返回true，否则返回false
        virtual bool IsSnapOff() const = 0;

        /// \brief 是否关闭了远程捕捉
        /// \return 关闭了远程捕捉返回true，否则返回false
        virtual bool IsRemoteSnapOff() const = 0;

        /// \brief 是否开启了平行捕捉
        /// 
        /// \return 开启了平行捕捉返回true，否则返回false
        virtual bool CanSnapParallel() const = 0;

        /// \brief 是否开启了垂直捕捉
        /// 
        /// \return 开启了垂直捕捉返回true，否则返回false
        virtual bool CanSnapPerpendicular() const = 0;

        /// \brief 是否开启了延伸捕捉
        /// 
        /// \return 开启了延伸捕捉返回true，否则返回false
        virtual bool CanSnapExtension() const = 0;

        /// \brief 是否开启了圆心捕捉
        /// 
        /// \return 开启了圆心捕捉返回true，否则返回false
        virtual bool CanSnapCenters() const = 0;

        /// \brief 是否开启了捕捉共线
        /// 
        /// \return 开启了返回true，否则返回false
        virtual bool CanSnapCollinear() const = 0;

        /// \brief 是否开启了边线延长线捕捉
        /// 
        /// \return 开启了返回true，否则返回false
        virtual bool CanSnap3DExtension() const = 0;

        /// \brief 是否开启了三维平行捕捉
        /// 
        /// \return 开启了返回true，否则返回false
        virtual bool CanSnap3DParallel() const = 0;

        /// \brief 是否强制水平竖直
        /// \return 是返回true，不是返回false
        virtual bool IsForceHorizontalOrVertical() const = 0;

        /// \brief 设置是否允许3D捕捉
        /// \param snap3dPoint 是否允许3D捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnap3dPoint(bool snap3dPoint) = 0;

        /// \brief 设置是否允许中点捕捉
        /// \param snapMiddlePoint 是否允许中点捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapMiddlePoint(bool snapMiddlePoint) = 0;

        /// \brief 设置是否允许捕捉最近点
        /// \param snapNearest 是否允许捕捉最近点
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapNearest(bool snapNearest) = 0;

        /// \brief 设置是否允许捕捉象限点
        /// \param snapQuadrants 是否允许捕捉象限点
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapQuadrants(bool snapQuadrants) = 0;

        /// \brief 设置是否关闭远程捕捉
        /// \param remoteSnapOff 是否关闭远程捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetIsRemoteSnapOff(bool remoteSnapOff) = 0;

        /// \brief 设置是否开启共线捕捉
        /// 
        /// \param snapCollinear 是否开启共线捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapCollineation(bool snapCollinear) = 0;

        /// \brief 是否关闭了平行捕捉
        /// 
        /// \param snapParallel 是否开启共线捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanParallelSnap(bool snapParallel) = 0;

        /// \brief 是否关闭了垂直捕捉
        /// 
        /// \param snapPerpendicular 是否开启共线捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanPerpendicularSnap(bool snapPerpendicular) = 0;

        /// \brief 是否关闭了延伸捕捉
        /// 
        /// \param snapExtension 是否开启延伸捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanExtensionSnap(bool snapExtension) = 0;

        /// \brief 是否关闭了边线延伸捕捉
        /// 
        /// \param snapEdgeLineExtension 是否开启边线延伸线捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnap3DExtension(bool snapEdgeLineExtension) = 0;

        /// \brief 设置是否打开三维平行线捕捉
        /// 
        /// \param snap3DParallel 是否打开三维平行线捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnap3DParallel(bool snap3DParallel) = 0;

        /// \brief 是否关闭了圆心捕捉
        /// 
        /// \param snapCenters 是否开启共线捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanCentersSnap(bool snapCenters) = 0;

        /// \brief 设置是否强制水平竖直
        /// \param forceHorizontalOrVertical 是否强制水平竖直
        /// \return 成功返回true，失败返回false
        virtual bool SetIsForceHorizontalOrVertical(bool forceHorizontalOrVertical) = 0;

        /// \brief 设置是否允许端点捕捉
        /// \param snapEndPoint 是否允许端点捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapEndPoint(bool snapEndPoint) = 0;

        /// \brief 设置是否允许自定义点捕捉
        /// \param snapCustomPoint 是否允许自定义点捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapCustomPoint(bool snapCustomPoint) = 0;

        /// \brief 设置是否允许捕捉原始线
        ///
        /// 拖拽图元时，捕捉原始线方向或原始线的垂直方向
        /// \param snapOriginalLine 是否允许捕捉原始线
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapOriginalLine(bool snapOriginalLine) = 0;

        /// \brief 设置是否关闭捕捉
        /// \param snapOff 是否关闭捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetIsSnapOff(bool snapOff) = 0;

        /// \brief 设置是否允许交点捕捉
        /// \param snapIntersectionPoint 是否允许交点捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapIntersectionPoint(bool snapIntersectionPoint) = 0;

#pragma region 捕捉像素容差设置
        /// \brief 获取捕捉距离，该设置对近程捕捉 & 远程捕捉 & 非对象捕捉同时生效
        ///
        /// 捕捉距离：设置在多远范围内可捕捉到
        /// \return 捕捉距离，单位为像素
        virtual int GetSnapDistance() const = 0;

        /// \brief 设置捕捉距离，该设置对近程捕捉 & 远程捕捉 & 非对象捕捉同时生效
        /// \param snapDistance 捕捉距离，单位为像素
        /// \return 成功返回true，失败返回false
        virtual bool SetSnapDistance(int snapDistance) = 0;

        /// \brief 获取近程捕捉距离
        ///
        /// 捕捉距离：设置在多远范围内可捕捉到
        /// \return 近程捕捉距离，单位为像素
        virtual int GetSnapDistanceForLocalSnap() const = 0;

        /// \brief 设置近程捕捉距离
        /// 
        /// \param snapDistance 捕捉距离，单位为像素
        /// \return 成功返回true，失败返回false
        virtual bool SetSnapDistanceForLocalSnap(int snapDistance) = 0;

        /// \brief 获取远程捕捉距离
        ///
        /// 捕捉距离：设置在多远范围内可捕捉到
        /// \return 远程捕捉距离，单位为像素
        virtual int GetSnapDistanceForRemoteSnap() const = 0;

        /// \brief 设置远程捕捉距离
        /// 
        /// \param snapDistance 捕捉距离，单位为像素
        /// \return 成功返回true，失败返回false
        virtual bool SetSnapDistanceForRemoteSnap(int snapDistance) = 0;

        /// \brief 获取非对象捕捉距离
        ///
        /// \return 捕捉距离，单位为像素
        virtual int GetSnapDistanceForNonreferenceSnap() const = 0;

        /// \brief 设置非对象捕捉距离
        /// 
        /// \param snapDistance 捕捉距离，单位为像素
        /// \return 成功返回true，失败返回false
        virtual bool SetSnapDistanceForNonreferenceSnap(int snapDistance) = 0;

#pragma endregion

        /// \brief 设置是否允许捕捉圆心点
        /// \param snapCenter 是否允许捕捉圆心点
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapCenter(bool snapCenter) = 0;

        /// \brief 设置是否允许捕捉垂足点
        /// \param snapPerpendicularPoint 是否允许捕捉垂足点
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapPerpendicularPoint(bool snapPerpendicularPoint) = 0;

        /// \brief 设置是否允许捕捉切点
        /// \param snapTangent 是否允许捕捉切点
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapTangent(bool snapTangent) = 0;

        /// \brief 设置是否允许捕捉水平、垂直线
        /// \param snapHorizontalVerticalLine 是否允许捕捉水平、垂直线
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapHorizontalVerticalLine(bool snapHorizontalVerticalLine) = 0;

        /// \brief 设置是否允许给定三维坐标系轴向的非对象捕捉
        /// \param value 给定布尔值
        /// \return 设置成功返回true，失败返回false
        virtual bool SetCanSnap3DAxialDirectionLine(bool value) = 0;

        /// \brief 获取长度增量捕捉值
        /// \return 长度增量捕捉值的集合，单位为像素
        virtual const std::vector<double>& GetSnapLengths() const = 0;

        /// \brief 获取角度增量捕捉值
        /// \return 角度增量捕捉值的集合，单位为度
        virtual const std::vector<double>& GetSnapAngles() const = 0;

        /// \brief 设置角度增量捕捉值
        /// \param snapAngles 角度增量捕捉值，单位为度
        /// \return 成功返回true，失败返回false
        virtual bool SetSnapAngles(const std::vector<double>& snapAngles) = 0;

        /// \brief 设置长度增量捕捉值
        /// \param snapLengths 长度增量捕捉值，单位为像素
        /// \return 成功返回true，失败返回false
        virtual bool SetSnapLengths(const std::vector<double>& snapLengths) = 0;

        /// \brief 设置是否允许长度增量捕捉
        /// \param snapLength 是否允许长度增量捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapLength(bool snapLength) = 0;

        /// \brief 设置是否允许角度增量捕捉
        /// \param snapAngle 是否允许角度增量捕捉
        /// \return 成功返回true，失败返回false
        virtual bool SetCanSnapAngle(bool snapAngle) = 0;

        /// \brief 设置捕捉参数
        /// \param pSnapSettings 另一个捕捉参数对象
        /// \return 成功返回true，失败返回false
        virtual bool SetSnapSettings(const ISnapSettings* pSnapSettings) = 0;

        /// \brief 获取捕捉样式颜色
        /// \return 捕捉样式颜色
        virtual Color GetSnapColor() const = 0;

        /// \brief 设置捕捉样式颜色
        /// \param color 捕捉样式颜色
        virtual void SetSnapColor(const Color& color) = 0;
    };
}// namespace gcmp

